/**
 * 文件名：@T_01.java <br/>
 * 包名：cn.efunbox.afw.core.test.bind <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core.test.bind;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;

import cn.efunbox.afw.core.annotation.mvc.Bind;

/**
 * 类名：T_01  <br />
 *
 * 功能：
 *
 * @author xtwin <br />
 * 创建时间：2015年12月1日 下午6:03:36  <br />
 * @version 2015年12月1日
 */
public class T_01 {
	
	private static final Log logger = LogFactory.getLog(T_01.class);
	
	@Test
	public void _03() throws Exception {
		User user = new User();
		
		PropertyUtils.setProperty(user, "name", "xt-win");
		PropertyUtils.setProperty(user, "age", "20");
		//PropertyUtils.setNestedProperty(user, "parent.name", "李四");
		
		logger.debug(user.getName());
		logger.debug(user.getAge());
	}
	
//	@Test
//	public void _02() throws Exception {
//		
//		OgnlRuntime.setNullHandler(Object.class, new NullHandler() {
//			@Override
//			public Object nullPropertyValue(Map context, Object target, Object property) {
//				logger.debug("here : " + context);
//				logger.debug("target : " + target);
//				logger.debug("property : " + property);
//				
//				Object value = null;
//				
//				try {
//					PropertyDescriptor desc = new PropertyDescriptor((String) property, target.getClass());
//					
//					value = desc.getPropertyType().newInstance();
//					
//					desc.getWriteMethod().invoke(target, value);
//				} catch (IntrospectionException e) {
//					logger.error(e);
//				} catch (IllegalAccessException e) {
//					e.printStackTrace();
//				} catch (IllegalArgumentException e) {
//					e.printStackTrace();
//				} catch (InvocationTargetException e) {
//					e.printStackTrace();
//				} catch (InstantiationException e) {
//					e.printStackTrace();
//				}
//				
//				return value;
//			}
//			
//			@Override
//			public Object nullMethodResult(Map context, Object target, String methodName, Object[] args) {
//				return null;
//			}
//		});
//		
//		User user = new User();
//		
//	
//		
//		Ognl.setValue("name", user, "xt-win");
//		Ognl.setValue("age", user, "20");
//		//Ognl.setValue("birthday", user, "2015-05-20");
//		Ognl.setValue("birthday", user, new Date());
//		
//		//Ognl.setValue("parent", user, new User());
//		Ognl.setValue("parent.name", user, "李四");
//		
//		logger.debug(user.getName());
//		logger.debug(user.getAge());
//		logger.debug(user.getParent().getName());
//	}

	@Test
	public void _01() throws Exception {
		
		//OgnlContext ctx = new OgnlContext();
		//ctx.
		/**
		 * 在框架中做限制，先执行校验（校验中会有类型转换操作），然后执行数据绑定
		 */
		
		Bind[] binds = T_01.class.getMethod("_01").getAnnotationsByType(Bind.class);
		
		Map<String, Object> map = new HashMap<String, Object>();
		
		Map<String, Object> target = new HashMap<String, Object>();
		
		for (Bind bind : binds) {
			
			// 类型
			Class<?> type = bind.type();
			
			// 前缀
			String prefix = bind.prefix();
			
			// 创建对象
			Object o = type.newInstance();
			
			for (Entry<String, Object> entry : map.entrySet()) {
				String key = entry.getKey();
				
				if (key.startsWith(prefix)) {
					// 
					//Ognl.setValue(key.substring(prefix.length() + 1), o, entry.getValue());
				}
			}
			
			target.put(prefix, o);
		}
	}
}











